package main

import (
	"fmt"
)

//map映射 类似php中的键值对数组

func main() {
	//使用 var 创建map
	var m map[string]int
	m = make(map[string]int) //分配空间
	m["num"] = 1             //如果没有上一行代码，这里会报错
	fmt.Println(m)

	//使用make关键字，创建map  make ( map [KeyType] ValueType )
	//和变量推导是一样的，用了 := 就不用先写var声明了
	map1 := make(map[string]string)
	map1["a"] = "aaa" //向map中添加元素，和php中是一样的
	map1["b"] = "bbb"
	fmt.Println(map1)
	map1["b"] = "333"
	fmt.Println(map1)

	//使用map关键字，创建空映射(比make更简洁一些)。格式： myMap := map[keyType]valueType{}
	//和使用make相比，它去掉了make和小括号。多了一对大括号
	map2 := map[string]int{}
	map2["age"] = 18
	map2["score"] = 99
	fmt.Println(map2)

	//使用map关键字，创建并填充映射。 在php中，是 key=>value 。 go 是 key:value
	map3 := map[string]string{"name": "jiang", "email": "jj@qq.com"} //这样写，最后一个元素后面，可以不带逗号
	fmt.Println(map3)

	//下面的例子，个人感觉实际开发中，不会这样写。而是会定义一个结构体
	map4 := map[string]interface{}{
		"name": "Lee",
		"age":  88,
		"addr": map[string]string{
			"country": "中国",
			"city":    "成都",
		}, //换行写的话，必须带逗号
	}

	fmt.Println(map4)
	//这里要取addr下的字段，就比较麻烦了。因为这个map中值的类型是空接口类型。所以要对它进行类型断言,也就是把"addr"再转换成map
	fmt.Println(map4["addr"].(map[string]string)["city"])

	//map 只有在初始化时，可以这样“批量赋值”.下面的代码会报错
	// map5 :=map[string]string{}
	// map5={
	// 	"title":"aaa",
	// 	"type":"news",
	// }
}
